#include <assert.h>

#include <atomic>
#include <iostream>
#include <thread>
#include <vector>

std::vector<int> queue_data;
std::atomic<int> _count;

void populate_queue() {
  unsigned const number_of_items = 10000;
  queue_data.clear();
  for (int i = 0; i < number_of_items; ++i) {
    queue_data.push_back(i);
  }
  _count.store(number_of_items, std::memory_order_release);  // 1 初始化存储
}

void consume_queue_items() {
  while (true) {
    int item_index;
    if (0 >= (item_index = _count.fetch_sub(1, std::memory_order_acquire)))  // 2 一个“读-改-写”操作
    {
      std::cout << std::this_thread::get_id() << ":wait for more items"
                << std::endl;  // 3 等待更多元素
      continue;
    }
    std::cout << std::this_thread::get_id() << ":" << queue_data[item_index - 1]
              << std::endl;  // 4 安全读取queue_data
  }
}

int main() {
  std::thread a(populate_queue);
  std::thread b(consume_queue_items);
  std::thread c(consume_queue_items);
  a.join();
  b.join();
  c.join();

  // 生产者，消费者模式。

  // 如果fetch_sub采用std::memory_order_acq_rel （本机测试）
  // b c 的消费不一样，b大概每消费100个数据，c才消费一个数据 ？(不是很理解)
  // 其他内存序都是交替消费.
  std::cout << "----End!------\n";

  return 0;
}